package GUI;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class Example_JFrame extends JFrame {
    // 输出文件路径常量
    private static final String OUTPUT_FILE_PATH = "output.txt";

    // 定义各个面板和标签
    private JPanel contentPanel;
    private JLabel titleLabel, footerLabel;
    private JPanel cloudSimPanel, networkPanel;

    // CloudSim和网络示例名称数组
    private String[] cloudSimExamples = {
            "CloudSimExample1", "CloudSimExample2", "CloudSimExample3", "CloudSimExample4",
            "CloudSimExample5", "CloudSimExample6", "CloudSimExample7", "CloudSimExample8"
    };
    private String[] networkExamples = {
            "NetWorkExample1", "NetWorkExample2", "NetWorkExample3", "NetWorkExample4"
    };

    // 构造函数，初始化UI
    public Example_JFrame() {
        super("CloudSim Examples");
        initializeUI(); // 调用初始化UI的函数
    }

    // 初始化界面
    private void initializeUI() {
        setTitle("CloudSim and Network Example Runner");
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 关闭窗口时销毁
        setLayout(new BorderLayout()); // 使用边界布局
        setSize(800, 600); // 设置窗口大小
        setLocationRelativeTo(null); // 窗口居中显示

        // 设置字体
        Font titleFont = new Font("Roboto", Font.BOLD, 40);
        Font labelFont = new Font("Roboto", Font.PLAIN, 22);
        Font buttonFont = new Font("Roboto", Font.PLAIN, 18);
        Font textAreaFont = new Font("Roboto", Font.PLAIN, 18);

        // 初始化标题和底部标签
        titleLabel = new JLabel("CloudSim and Network Examples", JLabel.CENTER);
        titleLabel.setFont(titleFont);
        titleLabel.setForeground(new Color(33, 33, 33));

        footerLabel = new JLabel("信管创新班22-1 2022215030 朱建宇", JLabel.CENTER);
        footerLabel.setFont(new Font("微软雅黑", Font.BOLD, 15));
        footerLabel.setForeground(new Color(0, 0, 0));

        // 创建CloudSim和网络示例面板
        cloudSimPanel = createExamplePanel(cloudSimExamples);
        networkPanel = createExamplePanel(networkExamples);

        // 内容面板，使用GridLayout布局将两个面板水平排列
        contentPanel = new JPanel();
        contentPanel.setLayout(new GridLayout(1, 2, 30, 0));
        contentPanel.add(cloudSimPanel);
        contentPanel.add(networkPanel);

        // 添加组件到窗口的不同区域
        add(titleLabel, BorderLayout.NORTH);
        add(contentPanel, BorderLayout.CENTER);
        add(footerLabel, BorderLayout.SOUTH);

        setVisible(true); // 设置窗口可见
    }

    // 创建示例面板
    private JPanel createExamplePanel(String[] examples) {
        JPanel examplePanel = new JPanel();
        examplePanel.setLayout(new BoxLayout(examplePanel, BoxLayout.Y_AXIS)); // 垂直布局
        examplePanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // 设置边距
        examplePanel.setBackground(new Color(245, 245, 245)); // 设置背景色

        // 为每个示例创建按钮
        for (String example : examples) {
            JButton exampleButton = new JButton(example);
            exampleButton.setFont(new Font("Roboto", Font.PLAIN, 18));
            exampleButton.setBackground(new Color(60, 120, 220)); // 按钮背景色
            exampleButton.setForeground(Color.WHITE); // 按钮文字颜色
            exampleButton.setFocusPainted(false); // 取消焦点效果
            exampleButton.setBorderPainted(false); // 取消按钮边框
            exampleButton.setPreferredSize(new Dimension(200, 50)); // 设置按钮大小
            exampleButton.addActionListener(e -> runExample(example)); // 按钮点击事件

            // 鼠标事件监听，改变按钮背景色
            exampleButton.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseEntered(MouseEvent e) {
                    exampleButton.setBackground(new Color(85, 170, 255)); // 鼠标悬停时背景色变浅
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    exampleButton.setBackground(new Color(60, 120, 220)); // 鼠标移出时恢复原色
                }
            });

            examplePanel.add(exampleButton); // 添加按钮到面板
            examplePanel.add(Box.createVerticalStrut(15)); // 添加垂直间距
        }

        return examplePanel;
    }

    // 运行示例并显示输出结果
    private void runExample(String example) {
        File file = new File(OUTPUT_FILE_PATH); // 创建输出文件

        // 创建一个新的窗口显示结果
        JFrame resultFrame = new JFrame("Example Output");
        JTextArea resultTextArea = new JTextArea();
        JScrollPane scrollPane = new JScrollPane(resultTextArea);
        resultTextArea.setFont(new Font("Roboto", Font.PLAIN, 18));
        resultTextArea.setEditable(false); // 设置为不可编辑
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        resultFrame.setBounds(400, 80, 800, 700); // 设置结果窗口的大小和位置
        resultFrame.add(scrollPane);

        try {
            // 重定向控制台输出到文件
            PrintStream ps = new PrintStream(file);
            System.setOut(ps);

            // 根据选择的示例执行相应的程序
            switch (example) {
                case "CloudSimExample1": CloudSimExample1.main(new String[]{}); break;
                case "CloudSimExample2": CloudSimExample2.main(new String[]{}); break;
                case "CloudSimExample3": CloudSimExample3.main(new String[]{}); break;
                case "CloudSimExample4": CloudSimExample4.main(new String[]{}); break;
                case "CloudSimExample5": CloudSimExample5.main(new String[]{}); break;
                case "CloudSimExample6": CloudSimExample6.main(new String[]{}); break;
                case "CloudSimExample7": CloudSimExample7.main(new String[]{}); break;
                case "CloudSimExample8": CloudSimExample8.main(new String[]{}); break;
                case "NetWorkExample1": NetworkExample1.main(new String[]{}); break;
                case "NetWorkExample2": NetworkExample2.main(new String[]{}); break;
                case "NetWorkExample3": NetworkExample3.main(new String[]{}); break;
                case "NetWorkExample4": NetworkExample4.main(new String[]{}); break;
            }

            // 读取文件并显示结果
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line;
            while ((line = reader.readLine()) != null) {
                resultTextArea.append(line + "\n"); // 将每行输出添加到文本框中
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace(); // 捕获并打印异常
        }

        resultFrame.setVisible(true); // 显示结果窗口
    }

    // 主函数，启动程序
    public static void main(String[] args) {
        new Example_JFrame(); // 创建并显示Example_JFrame窗口
    }
}
